□ BLE 메시지(Version 2)

o 메시지 형식

Q=<MessageCode>;<Version>;<DeviceType>;<DeviceID>;<Message>;<SeqNo>

구 분	설 명	비 고
MessageCode	o 0 : 상태 메시지 o 1 : 연결 메시지 o 2 : 격발 메시지 o 5 : 동작 메시지
Version	o ‘2’를 사용
DeviceType	o 1 : 추락보호복 o 2 : 노인낙상
DeviceID	o 디바이스 고유번호	SWYYMMTNNNNN
Message	o 각 메시지별 상이
SeqNo	o 메시지 일련번호	0 ∼ 999

【연결 메시지】

o BLE 접속時 1회 전송

o 메시지 내용

<CPUID>,<VersionInfo>,<BootResult>,<BatteryValue>

구 분	설 명	비 고
CPUID	o MCU 고유번호
VersionInfo	o 펌웨어 버전
BootResult	o 센서보드 부팅 결과	16진수 스트링
BatteryValue	o 배터리 레벨

o 오류 감지時 BootResult 설정값

#define SYS_INIT_FAULT_GPIO         0x00000001

#define SYS_INIT_FAULT_DMA          0x00000002

#define SYS_INIT_FAULT_UART         0x00000004

#define SYS_INIT_FAULT_ADC          0x00000008

#define SYS_INIT_FAULT_TWI          0x00000010  // I2C

#define SYS_INIT_FAULT_TIMER        0x00000020

#define SYS_INIT_FAULT_SPI          0x00000040

#define SYS_INIT_FAULT_QSPI         0x00000080

#define SYS_INIT_FAULT_RTC          0x00000100

#define SYS_INIT_FAULT_FLASH        0x00000200

#define SYS_INIT_FAULT_IMU          0x00000400

#define SYS_INIT_FAULT_BATTERY      0x00000800

#define SYS_INIT_FAULT_BUZZER       0x00001000

#define SYS_INIT_FAULT_W25Q         0x00002000

#define SYS_INIT_FAULT_TICK         0x00004000

#define SYS_INIT_FAULT_ACTUATOR     0x00008000

#define SYS_INIT_FAULT_BLE          0x00010000

#define SYS_INIT_FAULT_UPSIDE_DOWN  0x80000000

【상태 및 격발 메시지】

o 상태 메시지는 1분마다, 격발 메시지는 추락이나 낙상 검출時 전송

o 메시지 내용

<Trigger>,<Battery>,<Actuator>,<IMU>,<Flash>

구 분	설 명	비 고
Trigger	o 격발 유형	0 : 未격발
Battery	o 배터리 레벨	백분율 표시
Actuator	o Actuator 연결 상태	0 : 정상, 1 : 장애
IMU	o IMU 센서 오류 횟수
Flash	o 플래쉬 오류 횟수

【동작 메시지】

o 5분마다 위험도(5분 동안의 최댓값)를 전송

o 메시지 내용

0,<Risk>

구 분	설 명	비 고
Risk	o 위험도 수치	백분율 표시

□ 사용자 앱 동작

【BLE 메시지 처리】

o 스마트폰 앱은 블루투스를 통해 수신한 BLE 메시지를 MQTT 서버로 전달

o 격발 메시지를 수신한 경우, 수신한 BLE 메시지에 GPS 및 주소 정보를 첨부한 후 MQTT 서버로 전달

Q=2;2;2;<DeviceID>;<Message>;SeqNo;<Lattitude>,<Longitude>;<Location>;<Address>

o 연결 메시지의 BootResult가 ‘00000000’이 아닌 경우, 값에 따라 경고창을 표시하고 음성 메시지를 출력

o 상태 메시지의 Battery가 30 미만인 경우, 경고창을 표시하고 음성 메시지를 출력

o 상태 메시지의 Actuator⋅IMU⋅Flash가 ‘0’이 아닌 경우, 경고창을 표시하고 음성 메시지 및 진동을 출력

【디바이스 최초 등록】

o 연결 메시지의 DeviceID가 ‘XXX’인 경우, 디바이스 최초 등록 절차를 실시

o 최초 등록 절차

-  (스마트폰) CPUID⋅VersionInfo⋅BLEID를 포함하여 디바이스 등록 REST API(/api/down/devices)를 호출

- (서버) CPUID⋅VersionInfo⋅BLEID를 DB에 등록하고 DeviceID를 생성하여 REST API 응답으로 전달

-  (스마트폰) ‘set id <DeviceID>’ 명령어를 BLE를 통해 센서보드에 전달, 수신한 DeviceID를 센서보드에 기록

【사용자 및 보호자 등록】

o 사용자 등록

Q=9;2;2;<DeviceID>;0,<TelNo>,<TokenKey>;0

* 사용자 등록時 서버내 旣등록 보호자 정보 삭제

* TokenKey : 32 바이트 랜덤 스트링

o 사용자 전환

Q=9;2;2;<DeviceID>;1,<TelNo>,<TokenKey>;0

* 사용자 전환時 서버내 旣등록 보호자 정보 유지

o 보호자 등록

Q=9;2;2;<DeviceID>;2,<TelNo>,<Type>[,<TokenKey>];0

구 분	설 명	비 고
Type	o 0 : SMS만 수신 o 1 : 보호자 앱 모드	TokenKey 불요 TokenKey 필수

【만보기 데이터 전송】

o 걸음수⋅칼로리 등 만보기 데이터를 30분마다 MQTT 서버로 전송

Q=5;2;2;<DeviceID>;1,<Walk>,<Calory>,<Span>;0

* Span : 운동시간, 초 단위

【위치 정보 전송】

o 위치 정보를 5분마다 MQTT 서버로 전송

Q=5;2;2;<DeviceID>;2,<Latitude>,<Longitude>[;<위치명칭>;<주소>];0

* 위치명칭이 이전(위치 정보 메시지)과 동일한 경우, 위치명칭과 주소는 생략

□ REST API

【등록 및 로그인】

o 디바이스 등록

- 기능 : 디바이스를 등록하고 생성한 DeviceID를 전달

- URL : /api/down/devices

- 모드 : POST

- 전달 데이터

{

“id” :　“XXX”,

“type” : 2,

“hw” : “{CPUID}”,

“sw” : “{VersionInfo}”,

“ble” : “{BLEID}”

}

- 응답 형식 : application/json

- 응답 데이터

{

“id” : “SW2405D00001”

}

o 로그인 토큰 확인

- URL : /api/down/tokens/cache/:6digit?tkey={TokenKey}

- 모드 : GET

- 응답 형식 : application/json

- 응답 데이터

{

"token“ : ”{TokenString}“

}

o 사용자 로그인

- 기능 : 토큰을 기반으로 사용자 로그인

- URL : /api/down/tokens/:token

- 모드 : GET

- 응답 형식 : application/json

- 응답 데이터

200 OK

{

“id” : “{DeviceID}”,

“tel” : “{TelNo}”,

“mode” : 0 || 1

}

* 0 : 사용자, 1 : 보호자

404 Not Found

{

“message” : "User with token <token_string>, not found."

}

【각종 정보 검색】

o 각종 정보 검색 API 호출時 필요사항

- HTTP Authorization 헤더에 ‘Bearer {TokenString}’을 설정하여 REST API를 호출해야 하며,

- 각 REST API는 해당 기능 수행에 앞서 ‘TokenString’을 기준으로 사용자의 로그인 여부를 점검함

o 현재 상태정보 확인

- 기능 : 위험도⋅만보기 등 현재 상태정보 확인

- URL : /api/down/state/:id

- 모드 : GET

- 응답 형식 : application/json

- 응답 데이터

{

“location” : “<latitude>,<longitude>”,

"risk“ : 80,

“walk” : 5000,

“cal” : 150,

“span” : 3800

}

o 일자별 위험도 확인

- 기능 : 최근 14일간의 일자별 위험도 데이터를 확인

- URL : /api/down/risk/date/:id

- 모드 : GET

- 응답 형식 : application/json

- 응답 데이터

{

{

"dt : “20240425”,

“risk” : 50

},

⋅⋅⋅

{

"dt : “20240508”,

“risk” : 70

}

}

o 특정 일자 위험도 확인

- 기능 : 지정한 날짜의 5분 단위 위험도 데이터를 확인

- URL : /api/down/risk/data/:id?qrdate=20240508

* ‘qrdate’를 생략하면 오늘 데이터를 확인

- 모드 : GET

- 응답 형식 : application/json

- 응답 데이터

{

{

“dt” : “0000”,

“risk” : 50

},

⋅⋅⋅

{

“dt” : “2355”,

“risk” : 30

}

}

o 일자별 만보기 데이터 확인

- 기능 : 최근 14일간의 일자별 만보기 데이터(걸음수, 칼로리)를 확인

- URL : /api/down/walk/date/:id

- 모드 : GET

- 응답 형식 : application/json

- 응답 데이터

{

{

"dt : “20240425,

“walk” : 5000,

“cal” : 150,

“span” : 7500

},

⋅⋅⋅

{

"dt : “20240508”,

“walk” : 5000,

“cal” : 150,

“span” : 3600

}

}

o 특정 일자 만보기 데이터 확인

- 기능 : 지정한 날짜의 30분 단위 만보기 데이터(걸음수, 칼로리)를 확인

- URL : /api/down/walk/data/:id?qrdate=20240508

* ‘qrdate’를 생략하면 오늘 데이터를 확인

- 모드 : GET

- 응답 형식 : application/json

- 응답 데이터

{

{

“dt” : “0000”,

“walk” : 5000,

“cal” : 150,

“span” : 500

},

⋅⋅⋅

{

“dt” : “2355”,

“walk” : 5000,

“cal” : 150,

“span” : 1500

}

}

o 사고 건수 확인

- URL : /api/down/accident/count/:id

- 모드 : GET

- 응답 형식 : application/json

- 응답 데이터

{

“result” : <count>

}

o 사고 기록 확인

- URL : /api/down/accident/data/:id

- 모드 : GET

- 응답 형식 : application/json

- 응답 데이터

{

{

“dt” : “20240508”,

“gps” : “{latitude},{longitude}”

“location” : “{location_string}”,

“address” : “{address_string}”

},

⋅⋅⋅

{

“dt” : “20240508”,

“gps” : “{latitude},{longitude}”

“location” : “{location_string}”,

“address” : “{address_string}”

}

}

【각종 데이터 전달】

o Trigger Data 전달

- 기능 : 낙상 발생時 Trigger Data를 서버에 전달

- URL : /api/down/tdata/:id

- 모드 : POST

- Content-Type : application/octet-stream

- 전달 데이터 : 바이너리 바이트 스트림

- 응답 데이터 : HTTP 응답

□ DB 테이블

【sw_devices】

구분	유형	조건	비고
id	VARCHAR(32)	기본키	디바이스 ID
type	INT	NOT NULL
hw	VARCHAR(32)	“
sw	VARCHAR(32)	“
ble	VARCHAR(32)	“
dt	DATETIME	“	CURRENT_TIMESTAMP

【down_walk_data】

구분	유형	조건	비고
id	VARCHAR(32)	기본키	디바이스 ID
dt	DATETIME	기본키
walk	int	NOT NULL
cal	int	NOT NULL
span	int	NOT NULL	운동시간

【down_date_walk】

구분	유형	조건	비고
id	VARCHAR(32)	기본키	디바이스 ID
dt	DATE	기본키
walk	int	NOT NULL
cal	int	NOT NULL
span	int	NOT NULL	운동시간

【down_risk_data】

구분	유형	조건	비고
id	VARCHAR(32)	기본키	디바이스 ID
dt	DATETIME	기본키
risk	int	NOT NULL	위험도, 백분율

【down_date_risk】

구분	유형	조건	비고
id	VARCHAR(32)	기본키	디바이스 ID
dt	DATE	기본키
risk	int	NOT NULL	위험도, 백분율

【down_location】

구분	유형	조건	비고
id	VARCHAR(32)	기본키	디바이스 ID
dt	DATETIME	기본키
gps	VARCHAR(32)	NOT NULL	위도,경도
location	VARCHAR(100)	NULL	위치 명칭
address	VARCHAR(200)	NULL

【down_accident】

구분	유형	조건	비고
id	VARCHAR(32)	기본키	디바이스 ID
dt	DATETIME	기본키
mode	INT	NOT NULL	검출 모드
gps	VARCHAR(32)	NOT NULL	위도,경도
location	VARCHAR(100)	NULL	위치 명칭
address	VARCHAR(200)	NULL

【down_trigger_data】

구분	유형	조건	비고
id	VARCHAR(32)	기본키	디바이스 ID
dt	DATETIME	기본키
filepath	VARCHAR(256)	NOT NULL